#ifndef __SYNC_H__
#define __SYNC_H__

#include <inc/types.h>

#define IPS_NO_WAIT    0
#define IPS_WAIT_INT   1
#define IPS_WAIT       2

int  wait_pretend(void);
int  wait_try(void);
int  wait(void);

int  notify(int pid);
int  notify_ex(int pid, int lev);

#define WLEVEL_USER		0
#define WLEVEL_STIMER	0
#define WLEVEL_IPS		0
#define WLEVEL_START	8
#define WLEVEL_SYSTEM	16

int  set_soft_timer(uint32_t alarm, int pid);

typedef volatile char uips_node_t[12];
typedef volatile char semaphore_t[12];
typedef volatile char mutex_t[8];

int uips_is_finish(uips_node_t *node);

/* 0 for break/success, 1 for wait(again) */
void uips_wait(uips_node_t *node);
int  uips_wait_try(uips_node_t *node);

void mutex_init(mutex_t *mutex);
int  mutex_try_acquire(mutex_t *mutex);
int  mutex_acquire(mutex_t *mutex, uips_node_t *node);
void mutex_ac_break(mutex_t *mutex, uips_node_t *node);
void mutex_release(mutex_t *mutex);

void semaphore_init(semaphore_t *sem, uint32_t count);
int  semaphore_try_acquire(semaphore_t *sem);
int  semaphore_acquire(semaphore_t *sem, uips_node_t *node);
void semaphore_ac_break(semaphore_t *sem, uips_node_t *node);
/* 1 for notify, 0 for no notify */
int  semaphore_release(semaphore_t *sem);

int uips_recv(int ap, int uips);
int uips_recv_try(int uips, int wait, uint64_t *arg_ptr);
int uips_recv_break(int uips);


#endif
